import { ApiProperty } from '@nestjs/swagger'
import { Type } from 'class-transformer'
import { IsArray, IsEnum, IsInt, IsNumber, IsOptional, IsString, Max, Min, ValidateNested } from 'class-validator'
import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
import { EEnableStatus } from '@/shared/types/globalEnum'

@Entity('career')
export class Career {
  @PrimaryGeneratedColumn('increment')
  @IsNumber()
  careerId: number

  /**
   * 职业分类
   */
  @Column()
  @IsString()
  careerType: string

  /**
   * 职业名称
   */
  @Column()
  @IsString()
  careerName: string

  /**
   * 职业角色图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  careerRoleImage?: string

  /**
   * 职业角色背景图
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  careerRoleBackgroundImage?: string

  /**
   * 职业介绍视频
   */
  @Column({ type: 'json', nullable: true })
  @IsArray()
  @IsOptional()
  @ValidateNested({ each: true }) // 启用嵌套对象的校验
  @Type(() => MaterialItem) // 指定嵌套对象的类型
  careerMaterial?: MaterialItem[]

  /**
   * 高亮的职业徽章图
   */
  @Column({ nullable: true })
  @IsOptional()
  @IsString()
  selectedBadges?: string

  /**
   * 未高亮的职业徽章图
   */
  @Column({ nullable: true })
  @IsOptional()
  @IsString()
  unselectedBadges?: string

  /**
   * 门派徽章图
   */
  @Column({ nullable: true })
  @IsOptional()
  @IsString()
  careerBadgeImage?: string

  /**
   * 门派名称图片
   */
  @Column({ nullable: true })
  @IsOptional()
  @IsString()
  careerNameImage?: string

  /**
   * 操作难度
   */
  @Column()
  @IsInt()
  @Max(5)
  @Min(1)
  careerDifficulty: number

  /**
   * 重要程度
   */
  @Column({ nullable: true })
  @IsInt()
  @IsOptional()
  @Max(5)
  @Min(1)
  careerImportance?: number

  /**
   * 职业背景
   */
  @Column({ nullable: true })
  @IsString()
  @IsOptional()
  remark?: string

  /**
   * 显示状态
   */
  @ApiProperty({
    required: false,
    enum: EEnableStatus,
    default: EEnableStatus.DISABLED,
  })
  @Column({ default: EEnableStatus.ENABLED })
  @IsEnum(EEnableStatus)
  @IsOptional()
  visibleStatus?: EEnableStatus

  @CreateDateColumn()
  createdAt?: Date

  @UpdateDateColumn()
  updatedAt?: Date
}

export class MaterialItem {
  /**
   * 展示的图片
   */
  @IsString()
  @IsOptional()
  imageUrl?: string

  /**
   * 展示的视频
   */
  @IsString()
  @IsOptional()
  videoUrl?: string
}
